package com.xiaochen.cart.service.impl;

import com.alibaba.fastjson2.JSON;
import com.xiaochen.cart.service.CartService;
import com.xiaochen.feign.product.ProductFeignClient;
import com.xiaochen.model.entity.h5.CartInfo;
import com.xiaochen.model.entity.product.ProductSku;
import com.xiaochen.utils.AuthContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Slf4j
@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Autowired
    private ProductFeignClient productFeignClient;

    // 生成key user:cart:userId
    private String getCartKey(Long userId){
        return "user:cart:" + userId;
    }

    // 1.添加商品到购物车
    @Override
    public void addToCart(Long skuId, Integer skuNum) {
        // 1.验证用户登录状态(必须是登录状态)---->获取用户ID(作为redis的hash类型的key值)
        // 从threadLocal中获取用户ID
        Long userId = AuthContextUtil.getUserInfo().getId();
        log.info("用户ID:{}",userId);
        // 构建hash类型的key值
        String cartKey = getCartKey(userId);
        // 2.因为购物车的数据存储在redis中在,所以需要获取数据(根据用户id + skuId获取(就是key + field))
        // hash类型 key:userId  field:skuId value:sku信息(cartInfo)
        Object cartInfoObj = redisTemplate.opsForHash().get(cartKey, String.valueOf(skuId));
        // 3.如果购物车存在添加商品,把商品的数量进行相加(减)
        CartInfo cartInfo = null;
        if (cartInfoObj != null){
            // cartInfo != null ——> 意味着:添加到购物车的商品已经存在,直接添加商品数量即可
            // cartInfoObj --> CartInfo
            cartInfo = JSON.parseObject(cartInfoObj.toString(),CartInfo.class);
            // 数量相加
            cartInfo.setSkuNum(cartInfo.getSkuNum() + skuNum);
            // 设置属性,购物车商品选中状态
            cartInfo.setIsChecked(1);
            cartInfo.setUpdateTime(new Date());
        } else {
            // 4.如果购物车不存在添加商品,直接添加到购物车(添加到redis中)
            // 远程调用实现:通过nacos + openFeign实现 根据skuId获取商品sku信息
            cartInfo = new CartInfo();
            // 远程调用实现:根据skuId获取商品sku信息
            ProductSku productSku = productFeignClient.getBySkuId(skuId);
            cartInfo.setCartPrice(productSku.getSalePrice());
            cartInfo.setSkuNum(skuNum);
            cartInfo.setSkuId(skuId);
            cartInfo.setUserId(userId);
            cartInfo.setImgUrl(productSku.getThumbImg());
            cartInfo.setSkuName(productSku.getSkuName());
            cartInfo.setIsChecked(1);
            cartInfo.setCreateTime(new Date());
            cartInfo.setUpdateTime(new Date());
        }
        // 添加到redis中
        redisTemplate.opsForHash().put(cartKey,String.valueOf(skuId),JSON.toJSONString(cartInfo));


    }

    /**
     * 2.获取购物车列表
     * hash类型key,field,value
     * 根据userId获取value的值
     * @return
     */
    @Override
    public List<CartInfo> getCartList() {
        // 1.获取用户ID(userId)
        Long userId = AuthContextUtil.getUserInfo().getId();
        // 2.根据userId获取key
        String cartKey = getCartKey(userId);
        // 3.根据key获取value的值
        List<Object> valueList = redisTemplate.opsForHash().values(cartKey);
        if (!CollectionUtils.isEmpty(valueList)){
            List<CartInfo> cartInfoList = new ArrayList<>();
            for (Object cartInfoObj : valueList){
                CartInfo cartInfo = JSON.parseObject(cartInfoObj.toString(), CartInfo.class);
                cartInfoList.add(cartInfo);
            }
            return cartInfoList;
        }
        // 如果购物车没有数据,则返回空集合
        return new ArrayList<>();
    }
}
